function sayhello(){
	alert("hello");
}


var javaAccessModifier = new Array();
javaAccessModifier[0] = 'private';
javaAccessModifier[1] = 'protected';
javaAccessModifier[2] = 'public';

function startToRun(){
	//初始化
	$("#tbody1").empty();
	$("#note").empty();
	var oldclass;
	var newclass;
	var nowfunction;
	var oldclassArr;
	var newclassArr;
	var nowfunctionArr;
	
	oldclass = $('#oldclass').val();
	var oldclassdata=dataHandel(oldclass).trim();
	newclass = $('#newclass').val();
	var newclassdata=dataHandel(newclass).trim();
	nowfunction = $('#nowfunction').val()+"\n";
	var nowfunctiondata=dataHandel(nowfunction).trim();
	console.log(nowfunctiondata);
	
	
	var regLine=/\s*\n\s*/;
	oldclassArr=oldclassdata.split(regLine);
	newclassArr=newclassdata.split(regLine);
	nowfunctionArr=nowfunctiondata.split(regLine);
	
	
	// for(var i in oldclassArr){
	// 	console.log(i+" 为 "+delKuoHao(oldclassArr[i]));
	// }
	//检查现有类中是否包含原类中没有的方法/变量
	for(var i in newclassArr){
		if(newclassArr==""){
			break;
		}
		if(oldclassArr.indexOf(newclassArr[i])<0){
			var newnote=$("<p></p>").addClass("bg-danger").text("注意：现有类中的方法或变量 "+newclassArr[i]+" 在原类中不存在");
			$("#note").append(newnote);
			newclassArr.splice(i,1);
		}
	}
	//检查要添加的方法/变量中是否包含原类中没有的方法/变量
	for(var i in nowfunctionArr){
		if(nowfunctionArr==""){
			break;
		}
		if(oldclassArr.indexOf(nowfunctionArr[i])<0){
			var newnote=$("<p></p>").addClass("bg-danger").text("注意：你要插入的的方法或变量 "+nowfunctionArr[i]+" 在原类中不存在");
			$("#note").append(newnote);
			nowfunctionArr.splice(i,1);
		}
	}
	//检查现有方法是不是顺序正确的
	var count=0;
	var iserror=0;
	for(var i in newclassArr){
		if(newclassArr==""){
			break;
		}
		var p=oldclassArr.indexOf(newclassArr[i]);
		if(p<0){
			continue;
		}
		if(p>count){
			count=p;
			continue;
		}
		console.log("p= "+p+"count= "+count);
		if(p<count){
			var newnote=$("<p></p>").addClass("bg-danger").text("注意：现有类中的方法或变量 "+newclassArr[i]+" 处在错误的位置，请将其移动到 "+oldclassArr[count]+" 之前");
			$("#note").append(newnote);
			iserror++;
		}
	}
	if(iserror!=0){
		var newnote2=$("<p></p>").addClass("bg-danger").text("注意：现有类中的方法或变量顺序存在问题，此时建议的新方法/变量插入位置不可靠");
		$("#note").prepend(newnote2);
	}
	
	for(var i in nowfunctionArr){
		if(nowfunctionArr==""){
			break;
		}
		var p=oldclassArr.indexOf(nowfunctionArr[i]);
		var arr=oldclassArr.slice(0,p);//获取要添加函数之前的所有函数
		if(arr.length==0){
			var newnote=$("<p></p>").addClass("bg-primary").text("方法或变量 "+nowfunctionArr[i]+" 应插入到原类的最前面");
			$("#note").append(newnote);
			continue;
		}
		for(var x=arr.length-1;x>=0;x--){
			var y=newclassArr.indexOf(arr[x].replace(/private/i,"protected"));
			if(y>=0){
				var newnote=$("<p></p>").addClass("bg-primary").text("方法或变量 "+nowfunctionArr[i]+" 应插入到现有类的 "+newclassArr[y]+" 之后");
				$("#note").append(newnote);
				newclassArr.splice(y+1,0,nowfunctionArr[i]);
				break;
			}
		}
	}
	
	
}

/**
 * 处理传入的源代码
 * @param {Object} str 传入源代码
 */
function dataHandel(str){
	str=delzhushi(str);
	str=delFunctionContent(str);
	str=delImport(str);
	str=delEmptyLine(str);
	str=heBingKuoHao(str);
	str=getContentInClass(str);
	str=delKuoHaoKongGe(str);
	str=delKuoHao(str);
	str=str.replace(/(public|private|protected)/g,"");
	return str;
}

/**
 * 用于删除多行注释
 * @param {Object} str 传入源代码
 */
function delDuoHangZhuShi(str){
	while(str.indexOf("/*")>=0){
		var startZhuShi=str.indexOf("/*");
		if(str.indexOf("*/")<0){
			console.log("发现未成对的‘/*’");
			return str;
		}
		var endZhuShi=str.indexOf("*/");
		var onStart=str.substring(0,startZhuShi);
		var onEnd=str.substring(endZhuShi+2,str.length);
		str=onStart+onEnd;
	}
	return str;
}

/**
 * 用于删除单行注释
 * @param {Object} str 传入源代码
 */
function delDanHangZhuShi(str){
	while(str.indexOf("//")>=0){
		var startZhuShi=str.indexOf("//");
		var onStart=str.substring(0,startZhuShi);
		var linshi=str.substring(startZhuShi+2,str.length);
		var endZhuShi=linshi.indexOf("\n");
		if(str.substr(str.indexOf("//")-1,1)=="\n"){
			endZhuShi++;//如果这一整行都是注释,那删除整行
		}
		var onEnd=linshi.substring(endZhuShi,linshi.length);
		str=onStart+onEnd;
	}
	return str;
}

/**
 * 通过正则表达式删除所有注释
 * @param {Object} str 传入源代码
 */
function delzhushi(str){
	//转念一想与其这么写不如用正则表达式了
	//return delDuoHangZhuShi(delDanHangZhuShi(str));
	//这里的g表示全局匹配
	var regd=new RegExp("\/\/[^\n]*","g");
	//或者不用那么麻烦 直接这么写,前面的replace代表消除空行
	str=str.replace(/\n\/\/[^\n]*/g,"").replace(/\/\/[^\n]*/g,"");
	//删除块级注释
	str=str.replace(/\n\/\*(\s|.)*?\*\/\n/g,"\n").replace(/\/\*(\s|.)*?\*\//g,"");
	//删除@注释
	str=str.replace(/\@[^\(\)]*\([^\(\)]*\)/g,"");// g没起作用 不知为何
	str=str.replace(/\@[^\(\)]*\([^\(\)]*\)/g,"");
	str=str.replace(/\@[^\(\)]*\([^\(\)]*\)/g,"");
	str=str.replace(/\n\@[^\s]*/g,"").replace(/\@[^\s]*/g,"");
	//正则3行就实现了 正则nb!
	return str;
}		

/**
 * 删除函数中被{}包裹的部分
 * @param {Object} str 传入源代码
 */
function delFunctionContent(str){
	//var regFC=/(.*)(\{[^\}]*\})(.*)/g;//不行
	var regFC=/([^\{]*(class|interface)[^\{]*\{)/;
	var regDaKuoHao=/\{[^\{\}]*\}/;
	var str1=str.replace(regFC,"");
	var start=str.match(regFC);
	while(str1.indexOf(regDaKuoHao)<0&&str1.indexOf("{")<str1.indexOf("}")&&str1.indexOf("{")>=0){
		str1=str1.replace(regDaKuoHao,"");
	}
	if(start==null){
		return str1;
	}
	return start[0]+str1;
}

/** 如果存在两个以上的空行，将他们缩减到一个空行
 * @param {Object} str 传入源代码
 */
function delEmptyLine(str){
	var reg=/\n(\s*\n){2,}/g;
	str=str.replace(reg,"\n\n");
	return str;
}

/**
 * 删除所有的import行 并消除所有开头位置的空行
 * @param {Object} str 传入源代码
 */
function delImport(str){
	str=str.replace(/^import[^\n]*\n/g,"").replace(/import[^\n]*\n/g,"").replace(/^\n/g,"");
	return str;
}

/**
 * 删除小括号内的换行符
 * @param {Object} str 传入源代码
 */
function heBingKuoHao(str){
	//var reg=/(\()([^\n\(\)]*)((\n)([^\n\(\)]*))+(\))/g;//no
	//var reg=/(\([^\n\(\)]*)(\n\s*)([^\(\)]*\))/g;//not good enough
	var reg=/(?<=\([^\(\)]*)\n\s*(?=[^\(\)]*\))/g;//零宽断言
	str=str.replace(reg,"");
	return str;
}

/**
 * 取类中大括号内的值
 * @param {Object} str 传入源代码
 */
function getContentInClass(str){
	var reg=/([^\{\}]*\{)([^\{\}]*)(\}[^\{\}]*)/;
	str=str.replace(reg,"$2");
	return str;
}

/**
 * 移除小括号边上的空白字符
 * @param {Object} str 传入源代码
 */
function delKuoHaoKongGe(str){
	var regl=/\s*\(\s*/g;
	str=str.replace(regl,"(");
	var regr=/\s*\) */g;
	str=str.replace(regr,")");
	return str;
}

/**
 * 移除小括号及其中和之后整行文字
 * @param {Object} str 传入源代码
 */
function delKuoHao(str){
	var reg=/\([^\(\)]*\)[^\n]*\n/g;
	str=str.replace(reg,"()");
	return str;
}

/**
 * 根据传入的字符串生成一行表格
 * @param {Object} str
 */
function addTableLine(str){
	str=str.trim();
	var lineArr=str.split(" ");
	var newtr=$("<tr></tr>");
}